home *** CD-ROM | disk | FTP | other *** search
/ PC Media 23 / PC MEDIA CD23.iso / share / prog / anubis / avision.txt < prev    next >
Encoding:
Text File  |  1996-02-11  |  11.0 KB  |  234 lines

  1.         ╔═════════════════════════════════════════════════════════════╗
  2.         ║                                                             ║
  3.         ║   Características y explicaciones sobre el entorno AVISION  ║
  4.         ║                                                             ║
  5.         ╚════════════════╦═════════════════════════╦══════════════════╝
  6.                          ║   Anubis Software       ║
  7.                          ╚═════════════════════════╝             
  8.  
  9.  
  10.    Se denomina entorno AVISION a las facilidades de programación que facilitan
  11. las librerías de Anubis Software para utilizar pantallas virtuales menus y
  12. forms.
  13.  
  14.    En realidad se trata de todo un entorno que se centra en la presentación
  15. de los programas de entorno de texto de forma sencilla y práctica. 
  16.  
  17.    Las librería están escritas en C y no en C++.
  18.  
  19. ┌──────────────┐
  20. │ Introducción │
  21. └──────────────┴────────────────────────────────────────────────────────────
  22.  
  23.    Se puede considerar un ordenador como si fuese un sistema que responde 
  24. a ciertos eventos que se producen. Los eventos los puede producir un usuario
  25. o el propio ordenador.
  26.    Por tanto, es de esperar que un programa sólo actue respondiendo a los 
  27. eventos que se producen y el resto del tiempo no haga prácticamente nada.
  28.  
  29.    El entorno AVISION se encarga "esencialmente" de facilitar esta estructura
  30. y de tratarla de forma adecuada para que el resultado sean programas efectivos.
  31.  
  32.    En realidad con AVISION existen tres acontecimientos importantes que se
  33. consideran como eventos separados y estos son:
  34.  
  35.    -Se ha producido la pulsación de una tecla en el teclado. Este es el
  36. primer evento que se puede producir y tratar.
  37.    -Se ha producido alguna gestión con el ratón.
  38.    -No se ha producido ningún otro evento. Este evento es el que se denomina
  39. como evento vacio o de desocupación. Se trata como si fuese un evento ya que
  40. se puede requerir que haya rutinas que se ejecuten sin tener que estar 
  41. activadas por ningún evento de los anteriores o simplemente que se tengan que 
  42. ejecutar y no sepan como.
  43.  
  44.    Es evidente que cada uno de estos eventos activa la ejecución de una 
  45. serie de rutinas o procedimientos que se deben tratar cuando se produce
  46. dicho evento.
  47.  
  48.    La ejecución de dichas rutinas es sencilla, se encuentran todas ellas
  49. agrupadas en una lista. Y ante la ejecución de un evento se activan todas
  50. ellas sin importar el orden en que se ejecutan las mismas. (De momento es
  51. asi, aunque induzca un  error el hecho de que no se ejecuten ordenadamente.
  52. Más adelante se dará preferencia a que puedan ejecutarse de forma ordenada).
  53.  
  54.    Asi lo que tenemos es que podemos crear una lista de rutinas que se 
  55. activa cuando se produce uno de los eventos mencionados anteriormente.
  56. No es dificil crear este tipo de lista y menos aun mantenerla.
  57.  
  58.    Por razones de comodidad y velocidad las listas toman forma de Pilas
  59. en la implementación del sistema que proporciona Avision. De esta forma
  60. el sistema es más sencillo y más fácil de manejar. Además se suelen tener
  61. siempre las mismas rutinas ejecutandose en la pila por lo que las operaciónes
  62. de eliminación y inserción de nuevos procedimientos no se dan casi nunca.
  63.    Además, con el supuesto de que los procedimientos se ejecutan sin ningún
  64. orden predeterminado la estructura Pila ofrece todo lo necesario para la 
  65. gestión de eventos.
  66.  
  67.                ┌─────────────────────────-   Pila de Inserción
  68.                                        (En ella se insertan subprogramas)
  69.     │                    │
  70.     │                    │
  71.     ├────────────────────┤
  72.     │                    │
  73.     ├────────────────────┤
  74.     │                    │
  75.     ├────────────────────┤
  76.     │ Procedimiento n    │
  77.     ├────────────────────┤
  78.     │      ......        │
  79.     ├────────────────────┤
  80.     │ Procedimiento 2    │
  81.     ├────────────────────┤
  82.     │ Procedimiento 1    │
  83.     └────────────────────┘                                               
  84.                                                                         
  85.    En cualquier momento se puede añadir o sacar una rutina de la pila de
  86. eventos para que se pueda ejecutar o no.
  87.  
  88.    También es destacable la división de los eventos en dos pilas, una de
  89. ejecución rápida y otra de ejecución lenta. Esto se debe a que en ciertos
  90. puntos de un programa hay determinados algoritmos que no se deben ejecutar
  91. y otros que si. Por esto se han creado dos listas por evento en lugar de 
  92. una. La lista FAST es la que se debe poder ejecutar siempre sin comprometer
  93. la integridad del sistema y en cambio la lista normal se ejecuta sólo si
  94. se esta en un punto del programa base y no en una bifurcación del mismo.
  95.  
  96.  
  97.    Por otra parte, existe una serie muy completa de librerías que ayudan
  98. a compartir los sistemas de salida (especialmente la pantalla) que debido 
  99. a ser un sólo dispositivo deben compartir todos los procedimientos. 
  100.  
  101.    Si suponemos que cada subprograma ejerce de forma independiente, es necesario
  102. administrar los recursor 'finitos' del sistema.
  103.  
  104.    Normalmente se usan ventanas para que cada procedimiento individual haga
  105. lo que desea en su trozo de pantalla, pero también es posible que se deseen
  106. utilizar pantallas de uso general o ,incluso, utilizar toda la pantalla para
  107. su uso y después reponer los datos de nuevo.
  108.  
  109.    La disposición de las librerías para las presentaciones en pantalla es
  110. más o menos sencilla:
  111.  
  112.    -Se usan las librerías TEXTMODE.H y MOUSE.H para controlar la pantalla
  113. al más bajo nivel y el ratón también al más bajo nivel. Esto es poner
  114. caracteres y cadenas de carácteres en pantalla, cambiar los colores y 
  115. controlar el cursor. Así como gestionar el ratón de la forma más sencilla.
  116.  
  117.    -A modo de capa inmediatamente superior se encuentra la librería
  118. VENTANA2.H, que proporciona la abstracción de la pantalla convirtiendola en
  119. la mejor alternativa de uso para las diferentes aplicaciones que se ejecutan
  120. sobre la misma. Este debe ser el nivel más bajo al que se pueda 
  121. acceder directamente por los programas de aplicación y las librerías 
  122. inmediatamente superiores. La librería es lo suficientemente extensa para 
  123. que no haya problemas de falta de recursos. Además se apropia de la pantalla
  124. por completo con lo que es imposible acceder a la misma a un nivel más bajo.
  125. Junto con esta librería está la librería MENU.H que se encarga de gestionar
  126. los menus de persiana que suelen aparecer en toda aplicación que se precie.
  127.  
  128.    -En tercer nivel se encuentran los AVISION SERVICES, que son formas
  129. específicas que se usan con la pantalla y en combinación con otros recursos
  130. para dar más agilidad a la programación. (Los AVISION SERVICES) se componen
  131. de VBOTON2.H VCADENA2.H VOPCION2.H VSCROLL2.H ....
  132.    Cabe destacar que a este nivel todo el mundo se puede programar sus propios
  133. servicios y que las únicas limitaciones existentes son las de la imaginación del
  134. programador.
  135.  
  136.    - En cuarto nivel se encuentran las librerias muy específicas que 
  137. se forma exclusivamente por VFORMS2.H esta librería pretende reunir los
  138. AVISION SERVICES en un único conjunto y hacer de todo ello una potente opcion.
  139.  
  140.    -Y en último lugar se encuentran las librerías muy muy específicas como
  141. puedan ser librerías de TEXTO, SELECTORES, CONFIGURACIONES, ALERTAS ...
  142.  
  143.    A pesar de la existencia de muchos niveles, cabe destacar que las aplicaciones
  144. no pierden agilidad ni eficiencia puesto que hay librerías que dialogan 
  145. exclusivamente con VENTANA2.H y también cabe destacar que el usuario sólo
  146. dialogará con el último nivel de la capa.
  147.  
  148.  
  149. ┌──────────────┐
  150. │ Las tareas   │
  151. └──────────────┴────────────────────────────────────────────────────────────
  152.  
  153.    Para empezar profundizaremos de forma adecuada en la forma de gestionar
  154. las tareas que tiene el sistema Avision.
  155.    Veremos como se puede hacer una programación bien diferenciada por tareas
  156. sin arriesgar la efectividad de las mismas y sin tener que mezclarlas en 
  157. absoluto unas con otras.
  158.  
  159.    Supongamos que queremos que una tarea (programa) escriba la hora del
  160. sistema en una zona de la pantalla. Y que otra quiere simular un pequeño
  161. contador en otra parte de la pantalla.
  162.  
  163. El algoritmo de la primera viene a ser algo similar a esto:
  164.  
  165. void far tratareloj(void)
  166. {
  167.    struct time t;
  168.    char string[40];
  169.    gettime(&t);
  170.    sprintf(string, "  Hora actual: %2d:%2d:%2d.%2d",t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
  171.    gotoxy(1,1);
  172.    puts(string);
  173. }// end tratareloj
  174.  
  175. Y el algoritmo de la segunda es algo como esto otro:
  176.  
  177. void far tratacontador(void)
  178. {
  179.    static int cont=0;
  180.    gotoxy(30,30);
  181.    printf("%d",contador++);
  182. }// end tratacontador
  183.  
  184.    Como se puede apreciar ambas tareas son bien diferenciadas y realizan
  185. cosas muy distintas. Pero si queremos crear un programa que las ejecute
  186. simultaneamente entonces tendremos que ir llamandolas de forma simultanea
  187. en un bucle que no termine nunca.
  188.  
  189.    La forma que propone Avision es simplemente empilarlas en una pila y
  190. después dejarlas en paz llamado a la rutina de ejecución de la pila.
  191. Las rutinas para tratar las pilas de ejecución son Idlexec, Mouse y
  192. tecexec.
  193.  
  194.    Esto es como sigue:
  195.  
  196.    EventEmpilaHidleRoutine(tratareloj);
  197.    EventEmilaHiddleRoutine(tratacontador);
  198.  
  199.    while (!fin)  {
  200.       EventKeyboardExecution();
  201.       EventMouseExecution();
  202.       EventIddleExecution();
  203.    }// end while
  204.  
  205.    Aunque no parezca un gran cambio a simple vista, es notable la potencia
  206. que se adquiere con pocas mejoras al poder llamar todas las rutinas desde
  207. cualquier punto del programa, (Incluso desde una librería prefabricada !!).
  208.    Asi se puede simular algo similar a la multitarea (Aunque sólo bajo un
  209. programa.)
  210.  
  211.  
  212.    Visto esto, ahora pensemos en la mayoria de nuestras rutinas, unas se ejecutarán
  213. sólo bajo la pulsación de una tecla, otras bajo la presión del botón del ratón
  214. otras se ejecutarán ante el movimiento del ratón y otras se estarán ejecutando
  215. siempre. Con una sóla pila se puede conseguir el efecto deseado siempre que
  216. todas las rutinas tengan una especie de condición de entrada que venga a ser
  217. determinar si el raton se ha movido, si se ha pulsado una tecla, ...
  218. Este no es un mal sistema, pero es poco eficiente en cara a que todas las
  219. rutinas perderán tiempo comprobando cual de los eventos se ha producido y
  220. si les toca activarse ante dicho evento.
  221.    Lo cierto es que es preferible que las rutinas ya sepan de antemano que
  222. se ha producido el evento que las activa y que hagan directamente lo que
  223. tienen que hacer. Para conseguir esto no hay más que separar la pila de
  224. ejecución en tres sub-pilas, las cuales se ejecutan al haberse producido
  225. un evento determinado.
  226.    De esta forma hay una pila para cada evento que activa determinadas
  227. rutinas. En Avision hay tres pilas:
  228.    -Una que se ejecuta siempre que puede y sin esperar eventos.
  229.    -Una que se ejecuta siempre que se ha pulsado una tecla.
  230.       El código de la tecla está situado en una variable EventTecla.
  231.    -Y la última que se ejecuta siempre que se produce un evento con el ratón
  232.       Las variables mousex, mousey, evento, .... (definidas en MOUSE.H) contienen
  233.    la información necesaria para controlar el evento que se ha producido.
  234.